package com.log.com.log.service.impl;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.log.com.log.bean.LogWriterBean;

/**
 * 写日志操作Service
 * @author dell
 *
 */
public class LogWriterService {

	/**
	 * 日志文件名的时间格式
	 */
	private SimpleDateFormat nameFormat;
	
	/**
	 * 存储字符串  保证其不变地址
	 */
	private final StringBuilder builder=new StringBuilder();
	
	/**
	 * bean  也保持其地址不变  
	 */
	private final  LogWriterBean  bean=new LogWriterBean();
	
	/**
	 * 输出流
	 */
	private Writer writer;
	
	/**
	 * 写如的构造方法
	 * @param format
	 */
	public LogWriterService(String format){
		this.nameFormat=new  SimpleDateFormat(format);
	}
	
	/**
	 * 写日志
	 * @param t   时间间隔
	 * @param ss 传输过来的内容
	 * @param log  写入bean的内容  方便调用的时候设置其时间
	 * @return
	 */
	public boolean writerLog(long t,LogWriterBean log,Object ...ss) throws Exception{
		builder.setLength(0);
		for(Object object:ss){
			builder.append(object);
		}
		
		String content=builder.toString();
		
		if(content==null ||content.isEmpty()){
			return true;
		}
		
		//因为我们设置的生成日志的时间是默认是一小时 如果需要修改，那么在这里可以更改下。 不修改的话那么直接跳过
     	//	bean.setTimeSpace(2*60*60*1000);
		File file = null;
		
		if(log==null){
			log=bean;
		}
		if(t-log.getBaseTime()>=log.getTimeSpace()){
			//创建新的文件
			file=createNewLogFile(t,log);
		}
		
		if(!checkFile(file, log)){
			return false;
		}
		
		writer.write(content);
		writer.write(System.getProperty("line.separator"));
		writer.flush();
		
		return true;
	}

	/**
	 * 检查文件是否存在
	 * 1.根据文件检查是否存在  
	 * 2.检查保存的文件是否存在日志文件目录 不存在就创建
	 * 3.创建新文件后原先的文件流需要关闭
	 * 检查文件流是否存在
	 * @param fileName  要检查的文件名字
	 * @return
	 * @throws IOException 
	 */
	private boolean checkFile(File file,LogWriterBean log) throws IOException {
		
		if(!file.exists()){
			File fileParent=file.getParentFile();
			
			if(!fileParent.exists()){
				if(!fileParent.mkdirs()){
					log.setErrorContent(" Log  cannot create path "+file.getPath());
					return false;
				}
			}
			
			if(writer!=null){
				writer.close();
				writer=null;
			}
		}
		
		if(writer==null){
			writer=new FileWriter(file,true);
		}
		
		return true;
	}

	/**
	 * 创建新的日志文件
	 * 1.设置基准时间 
	 * 2.返回新文件的名字
	 * @param t  创建时间
	 * @return  生成的文件 
	 * @throws IOException 
	 */
	private File createNewLogFile(long t,LogWriterBean log) throws IOException {
		
		if(log!=null){
			log.setBaseTime((t/log.getTimeSpace())*log.getTimeSpace());
			File file=new File(nameFormat.format(new Date(log.getBaseTime())));
			if(writer!=null){
				writer.close();
				writer =null;
			}
			return  file;
		}
		
		return null;
		
	}

	
	
	
}
